﻿#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
using namespace std;

const int N = 2010;
int n;
int arr[N];
int bfs()
{
    int left = 1, right = 1;
    int ret = 0;
    while (left <= right)
    {
        ret++;
        int r = right;
        for (int i = left; i <= right; i++)
        {
            r = max(r, arr[i] + i);
            if (r >= n)
            {
                return ret;
            }
        }
        left = right + 1;
        right = r;
    }
    return -1;
}
int main()
{
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> arr[i];

    cout << bfs() << endl;

    return 0;
}

/*
链接：https://ac.nowcoder.com/acm/problem/229296
来源：牛客网

d被困在了一个迷幻森林，现在她面前有一条凶险的大河，河中央有
n个神奇的浮块，浮块按1∼n顺序标号，但两两并不相接，第i个浮块上有一个数字a[i]，可能是正数，也可能是负数,每块浮块都附带一个魔法结界用于传送，
当a[i]为正数时，dd可以选择传送到第i+k(1≤k≤a[i])个浮块上,
当dd抵达n号浮块时才可以顺利脱身，显然不管a[n]是多少，都没有任何意义，
当a[i]为负时，dd只能选择标号小于等于i+a[i]的任意一块浮块进行传送，
当i+a[i]<1时，默认只能传送到1的位置，
每次传送都会花费1s的时间，随着时间的流逝，迷雾森林的空气会被逐渐榨干，
她现在在1号浮块，她想知道，她最快多久能顺利脱身，如果始终无法逃脱，请输出−1
输入描述:
第一行一个数n(2≤n≤2000)
接下来一行n个数a[i](1≤|a[i]|≤2000)表示浮块上的数字
输出描述:
输出一行，表示对应的答案

示例1
输入
4
2 2 -1 2
输出
2
说明
1跳到2,1s
2跳到4,1s
共2s
*/

